#!/bin/bash

# 数据库自动备份脚本
# 功能：自动执行数据库同步备份，包含日志记录和错误处理

# 配置变量
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LOG_DIR="$SCRIPT_DIR/logs"
BACKUP_DIR="$SCRIPT_DIR/backup"
LOG_FILE="$LOG_DIR/backup-$(date +%Y%m%d).log"
MAX_LOG_DAYS=30
MAX_BACKUP_DAYS=30

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log() {
    echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
}

log_success() {
    echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] ✅ $1${NC}" | tee -a "$LOG_FILE"
}

log_error() {
    echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ❌ $1${NC}" | tee -a "$LOG_FILE"
}

log_warning() {
    echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ $1${NC}" | tee -a "$LOG_FILE"
}

# 创建必要的目录
create_directories() {
    log "创建必要的目录..."
    mkdir -p "$LOG_DIR"
    mkdir -p "$BACKUP_DIR"
    log_success "目录创建完成"
}

# 检查Node.js环境
check_nodejs() {
    log "检查Node.js环境..."
    if ! command -v node &> /dev/null; then
        log_error "Node.js未安装或不在PATH中"
        exit 1
    fi
    
    NODE_VERSION=$(node --version)
    log_success "Node.js版本: $NODE_VERSION"
}

# 检查必要的文件
check_files() {
    log "检查必要的脚本文件..."
    
    local required_files=(
        "sync-to-same-server.js"
        "test-database-connection.js"
    )
    
    for file in "${required_files[@]}"; do
        if [[ ! -f "$SCRIPT_DIR/$file" ]]; then
            log_error "缺少必要文件: $file"
            exit 1
        fi
    done
    
    log_success "所有必要文件检查完成"
}

# 测试数据库连接
test_database_connection() {
    log "测试数据库连接..."
    
    cd "$SCRIPT_DIR"
    if node test-database-connection.js >> "$LOG_FILE" 2>&1; then
        log_success "数据库连接测试通过"
        return 0
    else
        log_error "数据库连接测试失败"
        return 1
    fi
}

# 执行数据库备份
execute_backup() {
    log "开始执行数据库备份..."
    
    cd "$SCRIPT_DIR"
    local start_time=$(date +%s)
    
    if node sync-to-same-server.js >> "$LOG_FILE" 2>&1; then
        local end_time=$(date +%s)
        local duration=$((end_time - start_time))
        log_success "数据库备份完成，耗时: ${duration}秒"
        return 0
    else
        log_error "数据库备份失败"
        return 1
    fi
}

# 生成备份报告
generate_backup_report() {
    log "生成备份报告..."
    
    local backup_count=$(find "$BACKUP_DIR" -name "*.sql" -newer "$LOG_FILE" 2>/dev/null | wc -l)
    local backup_size=$(du -sh "$BACKUP_DIR" 2>/dev/null | cut -f1)
    
    echo "===========================================" >> "$LOG_FILE"
    echo "备份报告 - $(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG_FILE"
    echo "===========================================" >> "$LOG_FILE"
    echo "备份文件数量: $backup_count" >> "$LOG_FILE"
    echo "备份目录大小: $backup_size" >> "$LOG_FILE"
    echo "备份文件列表:" >> "$LOG_FILE"
    ls -la "$BACKUP_DIR"/*.sql 2>/dev/null | tail -10 >> "$LOG_FILE"
    echo "===========================================" >> "$LOG_FILE"
    
    log_success "备份报告生成完成"
}

# 清理旧文件
cleanup_old_files() {
    log "清理旧文件..."
    
    # 清理旧日志文件
    if [[ -d "$LOG_DIR" ]]; then
        local old_logs=$(find "$LOG_DIR" -name "backup-*.log" -mtime +$MAX_LOG_DAYS 2>/dev/null | wc -l)
        if [[ $old_logs -gt 0 ]]; then
            find "$LOG_DIR" -name "backup-*.log" -mtime +$MAX_LOG_DAYS -delete 2>/dev/null
            log "清理了 $old_logs 个旧日志文件"
        fi
    fi
    
    # 清理旧备份文件
    if [[ -d "$BACKUP_DIR" ]]; then
        local old_backups=$(find "$BACKUP_DIR" -name "*.sql" -mtime +$MAX_BACKUP_DAYS 2>/dev/null | wc -l)
        if [[ $old_backups -gt 0 ]]; then
            find "$BACKUP_DIR" -name "*.sql" -mtime +$MAX_BACKUP_DAYS -delete 2>/dev/null
            log "清理了 $old_backups 个旧备份文件"
        fi
    fi
    
    log_success "清理完成"
}

# 发送通知（可选）
send_notification() {
    local status=$1
    local message=$2
    
    # 这里可以添加邮件、短信或其他通知方式
    # 例如：发送邮件通知
    # echo "$message" | mail -s "数据库备份$status" admin@example.com
    
    log "通知: $message"
}

# 主函数
main() {
    log "==========================================="
    log "数据库自动备份开始 - $(date '+%Y-%m-%d %H:%M:%S')"
    log "==========================================="
    
    # 创建目录
    create_directories
    
    # 检查环境
    check_nodejs
    check_files
    
    # 测试数据库连接
    if ! test_database_connection; then
        log_error "数据库连接失败，备份终止"
        send_notification "失败" "数据库连接失败"
        exit 1
    fi
    
    # 执行备份
    if execute_backup; then
        generate_backup_report
        cleanup_old_files
        log_success "数据库自动备份完成"
        send_notification "成功" "数据库备份成功完成"
    else
        log_error "数据库备份失败"
        send_notification "失败" "数据库备份失败"
        exit 1
    fi
    
    log "==========================================="
    log "数据库自动备份结束 - $(date '+%Y-%m-%d %H:%M:%S')"
    log "==========================================="
}

# 显示帮助信息
show_help() {
    echo "数据库自动备份脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help     显示此帮助信息"
    echo "  -t, --test     仅测试数据库连接"
    echo "  -c, --clean    仅清理旧文件"
    echo "  -v, --verbose  详细输出"
    echo ""
    echo "示例:"
    echo "  $0              # 执行完整备份"
    echo "  $0 --test       # 仅测试连接"
    echo "  $0 --clean      # 仅清理旧文件"
}

# 处理命令行参数
case "${1:-}" in
    -h|--help)
        show_help
        exit 0
        ;;
    -t|--test)
        create_directories
        check_nodejs
        check_files
        test_database_connection
        exit $?
        ;;
    -c|--clean)
        create_directories
        cleanup_old_files
        exit 0
        ;;
    -v|--verbose)
        set -x
        main
        ;;
    "")
        main
        ;;
    *)
        echo "未知选项: $1"
        show_help
        exit 1
        ;;
esac
